﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Noris.Tools.TraceVisualiser.Interface;
using Noris.Tools.TraceVisualiser.TraceData;
using Noris.Tools.TraceVisualiser.Support;
using Noris.Tools.TraceVisualiser.Components;

namespace Noris.Tools.TraceVisualiser.Green.AplServer
{
    public class Func_GotoUser : Func_Base, IFunctionContextMenuItem
    {
        #region IPlugin Members
        /// <summary>
        /// Příznak, že Plugin je aktivní ve standardním běhu (tj. při běžném užiavtelském spuštění).
        /// Plně funkční pluginy tedy vrací true.
        /// Pluginy, které jsou ve vývoji, vrací false, takové jsou zobrazeny / spouštěny pouze v aplikaci, která běží v režimu Debug.
        /// </summary>
        bool IPlugin.Active { get { return true; } }
        #endregion
        #region IFunctionContextMenuItem Members
        bool IFunctionContextMenuItem.IsFunctionSuitableFor(FunctionContextMenuItemSuitableArgs args)
        {
            args.MenuItems.Add(new FunctionMenuItem(70, "Přejdi na konkrétního uživatele",
                "Vybranou událost vyhledá a zobrazí v řádku konkrétního uživatele (v řádku Uživatelé => Login).",
                true, Noris.Tools.TraceVisualiser.Pics.PicLibrary16.GoUp3_FromFile, null));
            return true;
        }
        bool IFunctionContextMenuItem.IsMenuItemEnabledFor(FunctionContextMenuItemRunArgs args)
        {
            // Funkce je dostupná pouze na událostech (ClickedItem není null), jejichž řádek je == Aplikační server / SQL proces:
            DataPointerStr item = args.ClickedItem;
            if (item.IsEmpty || item.Row.IsEmpty) return false;
            NodeInfo node = this.GetNode(args, item.Row);
            if (node == null) return false;
            if (!node.FullKey.StartsWith(AplServer.NorisAplConstants.NodeAplServer + "\\" + AplServer.NorisAplConstants.SubNodeAplSql, StringComparison.InvariantCultureIgnoreCase)) return false;
            IDataElement element = this.GetElement(args, args.ClickedItem);
            if (element == null) return false;
            return true;
        }
        void IFunctionContextMenuItem.Run(FunctionContextMenuItemRunArgs args)
        {
            this._RunGotoUser(args);
        }
        #endregion
        private void _RunGotoUser(FunctionContextMenuItemRunArgs args)
        {
            DataPointerStr item = args.ClickedItem;
            if (item.IsEmpty || item.Row.IsEmpty) return;
            IDataElement element = this.GetElement(args, args.ClickedItem);
            if (element == null) return;
            EventInfo eventInfo = element as EventInfo;
            if (eventInfo == null) return;
            IEventItem eventItem = eventInfo.EventItem;
            if (eventItem == null) return;

            string selectNode = eventItem.TargetHomeNode;
            TraceDocPointer docPointer = new TraceDocPointer();
            docPointer.AddExpandedNode(selectNode);
            docPointer.CollapseOtherNodes = false;
            docPointer.FirstVisibleNode = selectNode;
            docPointer.SelectedNode = selectNode;

            
            args.Result.DocPointer = docPointer;
        }
    }
}
